// 思路：将要改变this指向的方法挂到目标this上执行并返回
Function.prototype.defApply = function(target){
    if(typeof target !== 'function'){
        throw new TypeError('被绑定的对象需要是函数')
    }
    target = target || window
    target.fn = this
    let result
    //argument[0]不是参数，是this指向。所以当arguments[1]存在即有参数，
    //arguments[1]本身就是数组，参数都在该数组里面
    if(arguments[1]){
        result = target.fn(...arguments[1])
    }else{
        result = target.fn()
    }
    delete target.fn
    return result
}

function log(){
    console.log.defApply(this,...arguments)
}
log()  //
log([1]) // 1
log([1,2,3]) // 1 2 3
log([1,2],3) // 1 2
// log(1,2,3) // 报错

